抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

web3 学习总结

1. 合约的部署 – 需要发送主币,以及传入参数

以一个冒泡排序合约为例

合约代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract sort {

uint[] arr;

constructor(uint[] memory arrays) payable {
require(msg.value == 1);
arr = arrays;
}

function bubSort() external returns(uint[] memory) {
bool flag;
uint temp;
for (uint i = 0; i < arr.length - 1; i++) {
flag = true;
for (uint j = 0; j < arr.length - i - 1; j++) {
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
return arr;
}
}
  • 1.1 在 remix 中复制合约的 ABI 和 byteCode

  • image-20230413171249689

  • 1.2 在 vscode 上编写代码,创建 sort.abi 和 sort.js 文件

  • 1.3 在 根据 获取的交易哈希,在 ganache 上找到相应的合约地址

  • image-20230413172840790

  • image-20230413172920055

  • 1.4 在remix 上验证部署出来的合约地址是否真实,合约中是有主币的,所以是正确的

  • image-20230413172654112

部署合约的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let Web3 = require("web3");
web = new Web3(new Web3.providers.HttpProvider("Http://127.0.0.1:7545"));

var fs = require("fs");
var sortABI = JSON.parse(fs.readFileSync("D:\\VSCode\\VSCode_Data\\Web3Workspace\\js\\lesson_online\\temp\\sort.abi"),toString());

var contract = new web.eth.Contract(sortABI);

var byteCode = "0x60806040526040516106f33803806106f38339818101604052810190610025919061025c565b6001341461003257600080fd5b806000908051906020019061004892919061004f565b50506102a5565b82805482825590600052602060002090810192821561008b579160200282015b8281111561008a57825182559160200191906001019061006f565b5b509050610098919061009c565b5090565b5b808211156100b557600081600090555060010161009d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61011b826100d2565b810181811067ffffffffffffffff8211171561013a576101396100e3565b5b80604052505050565b600061014d6100b9565b90506101598282610112565b919050565b600067ffffffffffffffff821115610179576101786100e3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6101a28161018f565b81146101ad57600080fd5b50565b6000815190506101bf81610199565b92915050565b60006101d86101d38461015e565b610143565b905080838252602082019050602084028301858111156101fb576101fa61018a565b5b835b81811015610224578061021088826101b0565b8452602084019350506020810190506101fd565b5050509392505050565b600082601f830112610243576102426100cd565b5b81516102538482602086016101c5565b91505092915050565b600060208284031215610272576102716100c3565b5b600082015167ffffffffffffffff8111156102905761028f6100c8565b5b61029c8482850161022e565b91505092915050565b61043f806102b46000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063283fdc7814610030575b600080fd5b61003861004e565b60405161004591906102d9565b60405180910390f35b606060008060005b6001600080549050610068919061032a565b8110156101b8576001925060005b600182600080549050610089919061032a565b610093919061032a565b81101561019f5760006001826100a9919061035e565b815481106100ba576100b9610392565b5b9060005260206000200154600082815481106100d9576100d8610392565b5b9060005260206000200154111561018c57600081815481106100fe576100fd610392565b5b90600052602060002001549250600060018261011a919061035e565b8154811061012b5761012a610392565b5b90600052602060002001546000828154811061014a57610149610392565b5b9060005260206000200181905550826000600183610168919061035e565b8154811061017957610178610392565b5b9060005260206000200181905550600093505b8080610197906103c1565b915050610076565b50826101b85780806101b0906103c1565b915050610056565b50600080548060200260200160405190810160405280929190818152602001828054801561020557602002820191906000526020600020905b8154815260200190600101908083116101f1575b50505050509250505090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6102508161023d565b82525050565b60006102628383610247565b60208301905092915050565b6000602082019050919050565b600061028682610211565b610290818561021c565b935061029b8361022d565b8060005b838110156102cc5781516102b38882610256565b97506102be8361026e565b92505060018101905061029f565b5085935050505092915050565b600060208201905081810360008301526102f3818461027b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006103358261023d565b91506103408361023d565b9250828203905081811115610358576103576102fb565b5b92915050565b60006103698261023d565b91506103748361023d565b925082820190508082111561038c5761038b6102fb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006103cc8261023d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103fe576103fd6102fb565b5b60018201905091905056fea264697066735822122040692a2976cbd61653fb0d4195fa70c62b232f3d9b74fdf1f80f9e5bbada103c64736f6c63430008130033";

// 部署合约的代码
contract.deploy({
data: byteCode,
arguments: [[5,4,3,2,1]]
}).send({
from: "0x3C061FCEb96fca484e8c55C204BAd35C6fE2CE0f",
gas: 4700000,
value: 1
},function(err,result){
console.log("合约部署得到的交易哈希为:");
console.log(result);
})

2.1 调用合约的函数,payable函数

  • 2.1 调用 bubSort函数,对数组进行排序
1
2
3
4
5
6
7
8
9
10
11
12
// 调用合约函数

var address = "0x2A5cd706Ca94C6655197e6C05C8610CA04Ac8569";
var contract = new web.eth.Contract(sortABI,address);

contract.methods.bubSort().send({
from: "0x3C061FCEb96fca484e8c55C204BAd35C6fE2CE0f",
value: 1
}).on('receipt',function(result){
console.log(result);
})

  • 执行结果:image-20230413181139568
  • 2.2 执行之后获得交易的哈希,并在ganache上查看
  • image-20230413181155254
  • 2.3 将交易哈希通过 remix 上的debug 来查看合约中的变量
  • image-20230413181035431
  • 我们可以发现,传入的数组为[5,4,3,2,1] 调用排序函数之后,数组变成了[1,2,3,4,5] 说明执行成功
  • 2.4 完整的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
let Web3 = require("web3");
web = new Web3(new Web3.providers.HttpProvider("Http://127.0.0.1:7545"));

var fs = require("fs");
var sortABI = JSON.parse(fs.readFileSync("D:\\VSCode\\VSCode_Data\\Web3Workspace\\js\\lesson_online\\temp\\sort.abi"),toString());

var contract = new web.eth.Contract(sortABI);

// var byteCode = "60806040526040516106e63803806106e68339818101604052810190610025919061025c565b6001341461003257600080fd5b806000908051906020019061004892919061004f565b50506102a5565b82805482825590600052602060002090810192821561008b579160200282015b8281111561008a57825182559160200191906001019061006f565b5b509050610098919061009c565b5090565b5b808211156100b557600081600090555060010161009d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61011b826100d2565b810181811067ffffffffffffffff8211171561013a576101396100e3565b5b80604052505050565b600061014d6100b9565b90506101598282610112565b919050565b600067ffffffffffffffff821115610179576101786100e3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6101a28161018f565b81146101ad57600080fd5b50565b6000815190506101bf81610199565b92915050565b60006101d86101d38461015e565b610143565b905080838252602082019050602084028301858111156101fb576101fa61018a565b5b835b81811015610224578061021088826101b0565b8452602084019350506020810190506101fd565b5050509392505050565b600082601f830112610243576102426100cd565b5b81516102538482602086016101c5565b91505092915050565b600060208284031215610272576102716100c3565b5b600082015167ffffffffffffffff8111156102905761028f6100c8565b5b61029c8482850161022e565b91505092915050565b610432806102b46000396000f3fe60806040526004361061001e5760003560e01c8063283fdc7814610023575b600080fd5b61002b610041565b60405161003891906102cc565b60405180910390f35b606060008060005b600160008054905061005b919061031d565b8110156101ab576001925060005b60018260008054905061007c919061031d565b610086919061031d565b81101561019257600060018261009c9190610351565b815481106100ad576100ac610385565b5b9060005260206000200154600082815481106100cc576100cb610385565b5b9060005260206000200154111561017f57600081815481106100f1576100f0610385565b5b90600052602060002001549250600060018261010d9190610351565b8154811061011e5761011d610385565b5b90600052602060002001546000828154811061013d5761013c610385565b5b906000526020600020018190555082600060018361015b9190610351565b8154811061016c5761016b610385565b5b9060005260206000200181905550600093505b808061018a906103b4565b915050610069565b50826101ab5780806101a3906103b4565b915050610049565b5060008054806020026020016040519081016040528092919081815260200182805480156101f857602002820191906000526020600020905b8154815260200190600101908083116101e4575b50505050509250505090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61024381610230565b82525050565b6000610255838361023a565b60208301905092915050565b6000602082019050919050565b600061027982610204565b610283818561020f565b935061028e83610220565b8060005b838110156102bf5781516102a68882610249565b97506102b183610261565b925050600181019050610292565b5085935050505092915050565b600060208201905081810360008301526102e6818461026e565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061032882610230565b915061033383610230565b925082820390508181111561034b5761034a6102ee565b5b92915050565b600061035c82610230565b915061036783610230565b925082820190508082111561037f5761037e6102ee565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006103bf82610230565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103f1576103f06102ee565b5b60018201905091905056fea2646970667358221220ae8c4b8dcba12a3c05b294a45463cdbfcc21cbcdcfe3c2160fd3b8e26fa8304a64736f6c63430008130033";

// 部署合约的代码
// contract.deploy({
// data: byteCode,
// arguments: [[5,4,3,2,1]]
// }).send({
// from: "0x3C061FCEb96fca484e8c55C204BAd35C6fE2CE0f",
// gas: 4700000,
// value: 1
// },function(err,result){
// console.log("合约部署得到的交易哈希为:");
// console.log(result);
// })


// 调用合约函数

var address = "0x2A5cd706Ca94C6655197e6C05C8610CA04Ac8569";
var contract = new web.eth.Contract(sortABI,address);

contract.methods.bubSort().send({
from: "0x3C061FCEb96fca484e8c55C204BAd35C6fE2CE0f",
value: 1
}).on('receipt',function(result){
console.log(result);
})

// var answer;
// web.eth.getStorageAt(address,0,(err,result)=>{
// answer = web.utils.hexToNumber(result);
// console.log(answer);
// })

tips:如果函数需要传参,直接在调用函数的时候传入就可以了,如下:

image-20230413181624185

评论



政策 · 统计 | 本站使用 Volantis 主题设计